home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / source / src / arith / iutil.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-16  |  9.3 KB  |  474 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  iutil.c
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. /*      iutil.c         RD, 22.12.89    */
  16. /*    Added functions cIasuint, cIaslong, cIasulong,
  17.         Iisint, Iisuint, Iislong, Iisulong,
  18.         intasI, uintasI, longasI, ulongasI, RD, 16.12.91
  19.     Put definition of INTTOPLACE into iutil.c, RD, 16.12.91
  20. */
  21.  
  22. #include <LEDA/impl/iint.h>
  23. #include <LEDA/impl/iloc.h>
  24. #include <stdio.h>
  25.  
  26. #define INTTOPLACE  ((sizeof(int)+sizeof(PLACE)-1)/sizeof(PLACE))
  27. #define LONGTOPLACE ((sizeof(long)+sizeof(PLACE)-1)/sizeof(PLACE))
  28.  
  29. void cI(a)
  30.         register Integer * a;
  31. {       a->sign=PLUS;
  32.         a->length=0;
  33.         a->maxlength=INITLENGTH;
  34.         a->vec=newvec(&a->maxlength);
  35. }       /* cI */
  36.  
  37. void cIasint(a, i)
  38.         register Integer * a; register int i;
  39. {       register int j;
  40.         if (i<0) {
  41.                 a->sign=MINUS;
  42.                 i=-i;
  43.         } else 
  44.                 a->sign=PLUS;
  45.         a->maxlength=INTTOPLACE;
  46.         a->vec=newvec(&a->maxlength);
  47.     if ( INTTOPLACE == 1 ) {
  48.         a->vec[0]=i;
  49.         if ( i )
  50.             a->length=1;
  51.         else
  52.             a->length=0;
  53.         return;
  54.     }
  55.         j=0;
  56.         while (i) {
  57.                 a->vec[j]=i;
  58.                 i>>=LOGPLACE;
  59.         j++;
  60.         }
  61.     a->length=j;
  62. }               /* cIasint */
  63.  
  64. void cIasuint(a, i)
  65.         register Integer * a; register unsigned int i;
  66. {       register int j;
  67.         a->sign=PLUS;
  68.         a->maxlength=INTTOPLACE;
  69.         a->vec=newvec(&a->maxlength);
  70.     if ( INTTOPLACE == 1 ) {
  71.         a->vec[0]=i;
  72.         if ( i )
  73.             a->length=1;
  74.         else
  75.             a->length=0;
  76.         return;
  77.     }
  78.         j=0;
  79.         while (i) {
  80.                 a->vec[j]=i;
  81.                 i>>=LOGPLACE;
  82.         j++;
  83.         }
  84.     a->length=j;
  85. }               /* cIasuint */
  86.  
  87. void cIaslong(a, i)
  88.         register Integer * a; register long i;
  89. {       register int j;
  90.         if (i<0) {
  91.                 a->sign=MINUS;
  92.                 i=-i;
  93.         } else 
  94.                 a->sign=PLUS;
  95.         a->maxlength=LONGTOPLACE;
  96.         a->vec=newvec(&a->maxlength);
  97.     if ( LONGTOPLACE == 1 ) {
  98.         a->vec[0]=i;
  99.         if ( i )
  100.             a->length=1;
  101.         else
  102.             a->length=0;
  103.         return;
  104.     }
  105.         j=0;
  106.         while (i) {
  107.                 a->vec[j]=i;
  108.                 i>>=LOGPLACE;
  109.         j++;
  110.         }
  111.     a->length=j;
  112. }               /* cIaslong */
  113.  
  114. void cIasulong(a, i)
  115.         register Integer * a; register unsigned long i;
  116. {       register int j;
  117.         a->sign=PLUS;
  118.         a->maxlength=LONGTOPLACE;
  119.         a->vec=newvec(&a->maxlength);
  120.     if ( LONGTOPLACE == 1 ) {
  121.         a->vec[0]=i;
  122.         if ( i )
  123.             a->length=1;
  124.         else
  125.             a->length=0;
  126.         return;
  127.     }
  128.         j=0;
  129.         while (i) {
  130.                 a->vec[j]=i;
  131.                 i>>=LOGPLACE;
  132.         j++;
  133.         }
  134.     a->length=j;
  135. }               /* cIasulong */
  136.  
  137. void cIasI(a, b)
  138. /* create a from b */
  139.         register Integer *a;
  140.     register const Integer *b;
  141. {       register int i;
  142.         a->sign=b->sign;
  143.         a->length=b->length;
  144.         a->maxlength=b->length;
  145.         a->vec=newvec(&a->maxlength);
  146.         for (i=0; i<b->length; i++)
  147.                 a->vec[i]=b->vec[i];
  148. }               /* cIasI */
  149.  
  150. void cImaxlength(a, l)
  151.         register Integer * a;
  152.     int l;
  153. {       a->sign=PLUS;
  154.         a->length=0;
  155.         a->maxlength=l;
  156.         a->vec=newvec(&a->maxlength);
  157. }       /* cI */
  158.  
  159. void dI(a)
  160.         register Integer * a;
  161. {       delvec(a->vec, a->maxlength);
  162.         a->vec=NULL;
  163. }
  164.  
  165. Integer *  ncI()
  166. {    register Integer *a;
  167.     a=newInteger();
  168.     cI(a);
  169.     return a;
  170. }
  171.  
  172. Integer *  ncIasint(i)
  173.     int i;
  174. {    register Integer *a;
  175.     a=newInteger();
  176.     cIasint(a, i);
  177.     return a;
  178. }
  179.  
  180. Integer *  ncIasI(b)
  181.     Integer *b;
  182. {    register Integer *a;
  183.     a=newInteger();
  184.     cIasI(a, b);
  185.     return a;
  186. }
  187.  
  188. Integer *  ncImaxlength(l)
  189.     int l;
  190. {    register Integer *a;
  191.     a=newInteger();
  192.     cImaxlength(a, l);
  193.     return a;
  194. }
  195.  
  196. void ddI(a)
  197.     Integer *a;
  198. {    dI(a);
  199.     delInteger(a);
  200. }
  201.  
  202. /************************************/
  203.  
  204. void IasI(a, b)
  205.         register Integer *a;
  206.     register const Integer *b;
  207. {       register int i;
  208.         register int neededlength;
  209.     a->sign=b->sign;
  210.     neededlength=b->length;
  211.     if (a->maxlength < neededlength) {
  212.         delvec(a->vec, a->maxlength);
  213.         a->maxlength=neededlength;
  214.         a->vec=newvec(&a->maxlength);
  215.     }
  216.         a->length=neededlength;
  217.         for (i=b->length-1; i>=0; i--)
  218.                 a->vec[i]=b->vec[i];
  219. }               /* IasI */
  220.  
  221. void Iasint(a, i)
  222.     register Integer * a; register int i;
  223. {       register int j;
  224.         if (i<0) {
  225.                 a->sign=MINUS;
  226.                 i=-i;
  227.         } else 
  228.                 a->sign=PLUS;
  229.     if ( INTTOPLACE == 1 ) {
  230.         a->vec[0]=i;
  231.         if ( i )
  232.             a->length=1;
  233.         else
  234.             a->length=0;
  235.         return;
  236.     }
  237.         j=0;
  238.         while (i) {
  239.                 a->vec[j]=i;
  240.                 i>>=LOGPLACE;
  241.         j++;
  242.         }
  243.     a->length=j;
  244. }               /* Iasint */
  245.  
  246. void Ias0(a)
  247.     register Integer * a;
  248. {    a->length=0;
  249.     a->sign=PLUS;
  250. }
  251.  
  252. void Ias1(a)
  253.     register Integer * a;
  254. {    a->length=1;
  255.     a->sign=PLUS;
  256.     *(a->vec)=1;
  257. }
  258.  
  259. /************************************/
  260.  
  261. int Ilog(a)
  262.     const Integer * a;
  263. /* return (groesste Ganze von log_2(|a|), bzw -1 falls a==0); */
  264. {    register PLACE m;
  265.     register int i, j;
  266.  
  267.     i=a->length;
  268.     if (!i)
  269.         return -1;
  270.     j=0;
  271.     m=a->vec[i-1];
  272.     m>>=1;
  273.     while(m) {
  274.         m>>=1;
  275.         j++;
  276.     }
  277.     return j+(i-1)*LOGPLACE;
  278. }
  279.  
  280. int intlog(i)
  281.     register int i;
  282. /* return (groesste Ganze von log_2(|i|), bzw -1 falls a==0); */
  283. {    register int j;
  284.  
  285.     if (!i)
  286.         return -1;
  287.     j=0;
  288.     i>>=1;
  289.     while(i) {
  290.         i>>=1;
  291.         j++;
  292.     }
  293.     return j;
  294. }    /* intlog */
  295.  
  296. void Ierror(s)
  297.     const char * s;
  298. {    fprintf(stderr, "I: %s\n", s);
  299.     exit(-1);
  300. }        /* Ierror */
  301.  
  302. /******************************************************************/
  303.  
  304. static unsigned long maxint=(1<<sizeof(int)*8-1)-1;
  305. static unsigned long maxnegint=(1<<sizeof(int)*8-1);
  306. static unsigned long maxuint=1<<sizeof(int)*8;
  307. static unsigned long maxlong=(1<<sizeof(long)*8-1)-1;
  308. static unsigned long maxneglong=(1<<sizeof(long)*8-1);
  309.  
  310. BOOLEAN Iisint (a)
  311.     const Integer * a;
  312. {    register unsigned int u;
  313.     register int i;
  314.     if (!a->length)
  315.         return TRUE;
  316.     if (a->length>INTTOPLACE)
  317.         return FALSE;
  318. /* Maybe sizeof(int)<sizeof(PLACE), then INTTOPLACE==1 */
  319. /* We assume that sizeof(long)>=sizeof(PLACE) */
  320.     if (sizeof(int)<sizeof(PLACE))
  321.         if (a->sign==PLUS)
  322.             return a->vec[0] <= maxint;
  323.         else
  324.             return a->vec[0] <= maxnegint;
  325. /* Now we assume that sizeof(PLACE) divides sizeof(int) ! */
  326.     u=0;
  327.     for (i=a->length-1; i>=0; i--) {
  328.         u<<=LOGPLACE;
  329.         u+=a->vec[i];
  330.     }
  331.     if (a->sign==PLUS)
  332.         return u <= maxint;
  333.     else
  334.         return u <= maxnegint;
  335. }    /* Iisint */
  336.  
  337. BOOLEAN Iisuint (a)
  338.     const Integer * a;
  339. {    if (a->sign==MINUS)
  340.         return FALSE;
  341.     if (!a->length)
  342.         return TRUE;
  343.     if (a->length>INTTOPLACE)
  344.         return FALSE;
  345. /* Maybe sizeof(int)<sizeof(PLACE), then INTTOPLACE==1 */
  346. /* We assume, that sizeof(long)>=sizeof(PLACE) */
  347.     if (sizeof(int)<sizeof(PLACE))
  348.         return a->vec[0] <= maxuint;
  349. /* Now we assume, that sizeof(PLACE) divides sizeof(int) ! */
  350.     return TRUE;
  351. }    /* Iisuint */
  352.  
  353. BOOLEAN Iislong (a)
  354.     const Integer * a;
  355. {
  356. /* We assume that sizeof(long)>=sizeof(PLACE) and
  357.    that sizeof(PLACE) divides sizeof(long) ! */
  358.     register unsigned long u;
  359.     register int i;
  360.     if (!a->length)
  361.         return TRUE;
  362.     if (a->length>LONGTOPLACE)
  363.         return FALSE;
  364.     u=0;
  365.     for (i=a->length-1; i>=0; i--) {
  366.         u<<=LOGPLACE;
  367.         u+=a->vec[i];
  368.     }
  369.     if (a->sign==PLUS)
  370.         return u <= maxlong;
  371.     else
  372.         return u <= maxneglong;
  373. }    /* Iislong */
  374.  
  375. BOOLEAN Iisulong (a)
  376.     const Integer * a;
  377. {    if (a->sign==MINUS)
  378.         return FALSE;
  379. /* We assume, that sizeof(PLACE) divides sizeof(long) ! */
  380.     if (a->length<=LONGTOPLACE)
  381.         return TRUE;
  382.     else
  383.         return FALSE;
  384. }    /* Iisulong */
  385.  
  386.  
  387. int intasI (a)
  388.     const Integer * a;
  389. /* We assume Iisint(a) to be true ! */
  390. {    register unsigned int u;
  391.     register int i;
  392.     if (!a->length)
  393.         return 0;
  394. /* Maybe sizeof(int)<sizeof(PLACE), then INTTOPLACE==1 */
  395. /* We assume that sizeof(long)>=sizeof(PLACE) */
  396.     if (sizeof(int)<sizeof(PLACE))
  397.         if (a->sign==PLUS)
  398.             return a->vec[0];
  399.         else
  400.             return - a->vec[0];
  401. /* Now we assume that sizeof(PLACE) divides sizeof(int) ! */
  402.     u=0;
  403.     for (i=a->length-1; i>=0; i--) {
  404.         u<<=LOGPLACE;
  405.         u+=a->vec[i];
  406.     }
  407.     if (a->sign==PLUS)
  408.         return u;
  409.     else
  410.         return -u;
  411. }    /* intasI */
  412.  
  413. unsigned int uintasI (a)
  414.     const Integer * a;
  415. /* We assume Iisuint(a) to be true ! */
  416. {    register unsigned int u;
  417.     register int i;
  418.     if (!a->length)
  419.         return 0;
  420. /* Maybe sizeof(int)<sizeof(PLACE), then INTTOPLACE==1 */
  421. /* We assume that sizeof(long)>=sizeof(PLACE) */
  422.     if (sizeof(int)<sizeof(PLACE))
  423.         return a->vec[0];
  424. /* Now we assume that sizeof(PLACE) divides sizeof(int) ! */
  425.     u=0;
  426.     for (i=a->length-1; i>=0; i--) {
  427.         u<<=LOGPLACE;
  428.         u+=a->vec[i];
  429.     }
  430.     return u;
  431. }    /* uintasI */
  432.  
  433. long longasI (a)
  434.     const Integer * a;
  435. /* We assume Iislong(a) to be true ! */
  436. {
  437. /* We assume that sizeof(long)>=sizeof(PLACE) and
  438.    that sizeof(PLACE) divides sizeof(long) ! */
  439.     register unsigned long u;
  440.     register int i;
  441.     if (!a->length)
  442.         return 0;
  443.     u=0;
  444.     for (i=a->length-1; i>=0; i--) {
  445.         u<<=LOGPLACE;
  446.         u+=a->vec[i];
  447.     }
  448.     if (a->sign==PLUS)
  449.         return u;
  450.     else
  451.         return -u;
  452. }    /* longasI */
  453.  
  454. unsigned long ulongasI (a)
  455.     const Integer * a;
  456. /* We assume Iisulong(a) to be true ! */
  457. {
  458. /* We assume, that sizeof(PLACE) divides sizeof(long) ! */
  459.     register unsigned long u;
  460.     register int i;
  461.     if (!a->length)
  462.         return 0;
  463.     u=0;
  464.     for (i=a->length-1; i>=0; i--) {
  465.         u<<=LOGPLACE;
  466.         u+=a->vec[i];
  467.     }
  468.     return u;
  469. }    /* ulongasI */
  470.  
  471.  
  472.  
  473.